codeDistinct函数:找到一个未出现的数据,放到预分配好的内存里,最后输出满足distinct的记录。
static void codeDistinct(
Parse *pParse, /*分析语法树并且生成上下文*/
int iTab, /*排序索引用来检测唯一性*/
int addrRepeat, /*如果没有“去除重复”跳到此处*/
int N, /*元素的个数*/
int iMem /*首元素*/
){
Vdbe *v;
int r1;
v = pParse->pVdbe;/*声明一个处理数据库字节码的引擎*/
r1 = sqlite3GetTempReg(pParse);/*分配一个寄存器存储中间结果*/
sqlite3VdbeAddOp4Int(v, OP_Found, iTab, addrRepeat, iMem, N);/*把操作的值看成整数,然后添加这个操作符到虚拟机中*/
sqlite3VdbeAddOp3(v, OP_MakeRecord, iMem, N, r1);/*调用sqlite3VdbeAddOp3()修改指令的地址*/
sqlite3VdbeAddOp2(v, OP_IdxInsert, iTab, r1);/*实际也是使用sqlite3VdbeAddOp3()只是参数变为前4个,修改指令的地址*/
sqlite3ReleaseTempReg(pParse, r1);/*解除寄存器,sqlite3GetTempReg()分配的*/
}